package main

// 定义接口, 接口是一个规范
type Usber interface {
	start()
	stop()
}

// 如果接口里面有方法的话, 必须要通过结构体或者通过自定义类型来实现接口
type Phone struct {
	Name string
}

// 手机要实现usb接口的话, 必须得实现usb接口中的所有方法
func (p Phone) start() {
	println(p.Name, "手机开始工作")
}
func (p Phone) stop() {
	println(p.Name, "手机停止工作")
}

type Camera struct {
	Name string
}

func (c Camera) start() {
	println(c.Name, "相机开始工作")
}

func (c Camera) stop() {
	println(c.Name, "相机停止工作")
}

func (c Camera) run() {
	println("相机开始运行了..")
}

// 电脑
type Computer struct {
	brand string
	price float64
}

func (c Computer) work(usber Usber) {
	if _, ok := usber.(Phone); ok {
		usber.start()
	} else {
		usber.stop()
	}
	println(c.brand, c.price)
}

func main() {
	//p := Phone{
	//	Name: "华为手机",
	//}
	//p.start()
	//
	////XXX golang中接口就是一个数据类型
	//var p1 Usber
	////XXX 表示手机实现Usber接口
	//p1 = p
	//p1.start()
	//p1.stop()
	//
	//c := Camera{
	//	Name: "哈苏",
	//}
	//// 相机实现了Usber接口, java中类型提升.
	//var c1 Usber = c
	//c1.start()
	//c1.stop()
	//c.run()

	var computer = Computer{}
	var phone = Phone{
		Name: "小米手机",
	}
	var camera = Camera{
		Name: "尼康相机",
	}

	computer.work(phone)
	computer.work(camera)
}
